#include "ModuleMorpho.h"

void ModuleMorpho::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();
  layout=new QVBoxLayout(win);

	sb_kernelW=new QSpinBox(win);
	sb_kernelW->setRange(3,21);
	sb_kernelW->setSingleStep(2);
	sb_kernelW->setValue(3);
	sb_kernelW->setPrefix(tr("kernelW="));

	sb_kernelH=new QSpinBox(win);
	sb_kernelH->setRange(3,21);
	sb_kernelH->setSingleStep(2);
	sb_kernelH->setValue(3);
	sb_kernelH->setPrefix(tr("kernelH="));

	cb_operation=new QComboBox(win);
	cb_operation->addItem("Erosion");	
	cb_operation->addItem("Dilatation");	
	cb_operation->addItem("Ouverture");	
	cb_operation->addItem("Fermeture");	

	sb_iterations=new QSpinBox(win);
	sb_iterations->setRange(1,100);
	sb_iterations->setPrefix(tr("nIt="));

	QHBoxLayout * hlayout=new QHBoxLayout();
	hlayout->addWidget(sb_kernelW);
	hlayout->addWidget(sb_kernelH);
	layout->addWidget(cb_operation);
	layout->addLayout(hlayout);
	layout->addWidget(sb_iterations);
}
////////////////////////////////////////////////////////////////////////////////
void ModuleMorpho::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleMorpho::process()
{
	cv::Mat kernel(sb_kernelW->value(),sb_kernelH->value(),CV_8UC1);
	kernel.setTo(1);
	
	if(cb_operation->currentIndex()==0)
	{
		cv::erode(image,image,kernel,cv::Point(-1,-1),sb_iterations->value());
	}
	else if(cb_operation->currentIndex()==1)
	{
		cv::dilate(image,image,kernel,cv::Point(-1,-1),sb_iterations->value());
	}
	else if(cb_operation->currentIndex()==2)
	{
		cv::erode(image,image,kernel,cv::Point(-1,-1),sb_iterations->value());
		cv::dilate(image,image,kernel,cv::Point(-1,-1),sb_iterations->value());
	}
	else if(cb_operation->currentIndex()==3)
	{
		cv::dilate(image,image,kernel,cv::Point(-1,-1),sb_iterations->value());
		cv::erode(image,image,kernel,cv::Point(-1,-1),sb_iterations->value());
	}
	return image;
}
////////////////////////////////////////////////////////////////////////////////
void ModuleMorpho::setInput(int n,const cv::Mat & m)
{
	if(n==0)
	{	
		image=m.clone();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleMorpho::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleMorpho::getName()
{
	return trUtf8("Opération Morphologique");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleMorpho::nbInputs()
{
	return 1;
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleMorpho::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==4)
	{
		cb_operation->setCurrentIndex(list_params[0].toInt());
		sb_kernelW->setValue(list_params[1].toInt());
		sb_kernelH->setValue(list_params[2].toInt());
		sb_iterations->setValue(list_params[3].toInt());

		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleMorpho::getParams()
{
	return QString::number(cb_operation->currentIndex())+tr(";")+
				 QString::number(sb_kernelW->value())+tr(";")+
				 QString::number(sb_kernelH->value())+tr(";")+
				 QString::number(sb_iterations->value());
}

////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModuleMorpho::clone()
{
	return new ModuleMorpho;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleMorpho::help(int id)
{
	if(id==-2)
	{
		return tr("Réalise un operation morphologique");
	}
	else if(id==-1)
	{
		return tr("image");
	}
	else if(id==0)
	{
		return tr("image");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
Q_EXPORT_PLUGIN2(ModuleMorpho_plugin,ModuleMorpho);  
